/*
 * SchedulingHelp.java
 *
 * Created on Streda, 2007, november 14, 21:15
 *
 */

package logic.schedulers;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import logic.gridSimInterface.resource.ResourceCharacteristicExt;
import logic.gridSimInterface.user.GridletInfo;

/**
 * Staticky objekt, ktory ma zopar funkcii vyuzitelnych pri planovani na lokalnej
 * aj na globalnej urovni.
 *
 * @author alvin
 */
public class SchedulingHelp {

    /**
     * Vracia zoznam zdrojov, ktore su schopne vykonat danu ulohu
     */
    public static LinkedList<ResourceCharacteristicExt> getSuitableResources(
            Collection<ResourceCharacteristicExt> resourcesInfo,
            GridletInfo gridletInfo) {
        LinkedList<ResourceCharacteristicExt> retVal = new LinkedList<ResourceCharacteristicExt>();
        for (ResourceCharacteristicExt resInfo : resourcesInfo)
            if (resInfo.isSuitableResource(gridletInfo))
                retVal.add(resInfo);
        return retVal;
    }
    
    /**
     * Zistuje, ci v zadanej mnozine zdrojov existuje zdroj, ktory je schopny
     * vykonat zadanu ulohu
     * @param resourcesInfo      zoznam informacii o dostupnych zdrojoch
     * @param gridletInfo       informacie o ulohe
     * @return  true, ak existuje vhodny zdroj
     */
    public static boolean hasSuitableResource(
            Collection<ResourceCharacteristicExt> resourcesInfo,
            GridletInfo gridletInfo) {
    	for (ResourceCharacteristicExt element : resourcesInfo) {
            if(element.isSuitableResource(gridletInfo))
                    return true;
        }
    	return false;
    }
    
    
    /**
     * Ziskanie zoznamu volnych zdrojov.
     * @param   resourcesInfo       zoznam dostupnych zdrojov
     * @return
     *   zoznam volnych zdrojov, ktore maju volny aspon jeden procesor,
     *   zotriedeny od najvyssieho MIPS po najnizsi.
     */
    public static LinkedList<ResourceCharacteristicExt> getFreeResources(
            Collection<ResourceCharacteristicExt> resourcesInfo) {
    	LinkedList<ResourceCharacteristicExt> retVal = new LinkedList<ResourceCharacteristicExt>();
        for (ResourceCharacteristicExt resInfo : resourcesInfo) {
            if(resInfo.hasFreePE())
                retVal.add(resInfo);
        }
    	Collections.sort(retVal, new CompareFreeResource());
    	return retVal;
    }
    

    /**
     * Komparator, ktory triedy zdroje podla ich MIPS na procesor.
     * Zdroje s najvyssim MIPS budu prve.
     */
    private static class CompareFreeResource implements Comparator<ResourceCharacteristicExt> {
        public int compare(ResourceCharacteristicExt res1, ResourceCharacteristicExt res2) {  
            Double PE1 = new Double(res1.getMIPSRatingOfOnePE());
            Double PE2 = new Double(res2.getMIPSRatingOfOnePE());
            return PE2.compareTo(PE1);
        }        
    }
    
}
